import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 1.ArrayList数组的add方法：源码剖析：函数如何调用？grow如何扩容？每次扩容多少倍？
 * 2.源码理解思想就好，读源码可以让自己成长的更快！
 * 3.迭代器：打印集合中的元素，这个类必须实现iterable接口才能够使用迭代器Iterator ， Map接口就不能用！
 * 4.subList()并不是截取的一段数组，而是原来的数组（指向其中的一段）
 * 5.ArrayList的三种构造方法
 */


public class arrayList {
    public static void main1(String[] args) {
        List<Integer> arrayList =  new java.util.ArrayList<>();

        //默认尾插（看源码！）
        arrayList.add(123);
        arrayList.add(0,40);   //index不能超

        java.util.ArrayList<Integer> arrayList2 = new java.util.ArrayList<>();
        arrayList2.add(1);
        arrayList2.add(2);
        arrayList2.add(3);
        arrayList2.add(4);
        arrayList.addAll(arrayList2);  //只能添加同类型的数据
        System.out.println(arrayList);  //ArrayList重写了toString()方法

        System.out.println("=====================");
        //迭代器(打印集合中的元素，这个类必须实现iterable接口才能够使用迭代器Iterator)
        Iterator<Integer> it = arrayList.iterator();
        //way1遍历:
        while(it.hasNext()){
            System.out.println(it.next());
            //TODO:去查资料了解it.remove()需要注意的问题
            //it.remove();
        }
        //way2遍历:
        System.out.println("=====================");
        for(Integer x: arrayList){
            System.out.println(x);
        }



    }


    public static void main2(String[] args) {
        List<Integer> list = new java.util.ArrayList<>();
        list.add(11);
        list.add(22);
        list.add(33);
        list.add(11);
        list.add(44);
        list.add(55);
        System.out.println(list);

        //test remove(index: i)
        /*int x = list.remove(1);
        System.out.println(list);*/

        //test remove(Object o)
        /*boolean ret = list.remove(list.get(1));
        System.out.println(ret);
        System.out.println(list);*/

        //set 方法
        list.set(1, 100);
        System.out.println(list);

        boolean ret = list.contains(11);
        System.out.println(ret);


        System.out.println(list.indexOf(11));   //从头找出现的第一个元素11
        System.out.println(list.lastIndexOf(11));//从尾找出现的第一个元素11


        /**
         * subList()并不是截取的一段数组，而是原来的数组（指向其中的一段）
         */
        List<Integer> eList =  list.subList(2,5);//左闭右开
        eList.set(2,888);
        System.out.println("修改截取的："+eList);
        System.out.println("原来的："+list);


        list.clear();
        System.out.println(list);


    }


    //ArrayList的三种构造方法：
    public static void main(String[] args) {
        List<Iterator> list = new java.util.ArrayList<>();
        List<Iterator> list2 = new java.util.ArrayList<>(30);  //初始容量
        List<Iterator> list3 = new java.util.ArrayList<>(list);

    }

}
